#include <stdio.h>
#include <iostream>
#include <vector>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>


typedef void (*handler_t)();
std::vector <handler_t> handlers;//因为namespace 没展开
int arr[10]={0};
void fun_one()
{
  printf("这是一个给数组arr元素全部初始化为1的临时任务\n");
  int i=0;
  int sz=sizeof(arr)/sizeof(arr[0]);
  for(i=0;i<sz;i++)
  {
    arr[i]=1;
    printf("%d",arr[i]);
  }
}

void fun_two()
{
 printf("这是一个将数组进行向后累加的临时任务\n");
 int i=0;
 int sz=sizeof(arr)/sizeof(arr[0]);
 int old_val=arr[0];
 for(i=1;i<sz;i++)
 {
  arr[i]+=old_val;
  printf("%d",arr[i]);
 }
}
void LOAD()
{
  handlers.push_back(fun_one);
  handlers.push_back(fun_two);
}


int main()
{
  printf("i am father\n");
  int i=0;
  for(i=0;i<150;i++)
  {
    printf("%d %s\n",i,strerror(i));
  }
  sleep(3);
  pid_t pid=fork();
  if(pid<0)
  {
    printf("error\n");
  }

  if(pid==0)
  {
   int cnt=5; 
    while(cnt)
    {
    sleep(2);
    //printf("i am child,pid:%d,ppid:%d\n",getpid(),getppid());
    printf("我是子进程 :%d",cnt--);
    }
    exit(12);
  }

 if(pid>0)
 {
   int quit=0;
  while(!quit)
  {
   int status =0;
   pid_t res=waitpid(-1,&status,WNOHANG);//以非阻塞的方式等待
   if(res>0)
   {
     //等待成功&&子进程退出
     //printf("等待子进程退出成功，退出码：%d\n",WEXITSTATUS(status));
     printf("等待子进程退出成功，退出码：%d\n",WEXITSTATUS(status));
     quit=1;
   }
   else if(res==0)
   {
     //等待成功&&子进程没有退出
     printf("进程还在运行中，暂时还没有退出，父进程可以再等一等，处理一下其他事情？？\n");
     if(handlers.empty())
     {
       LOAD();
     }
   for(auto iter : handlers) 
   {
     iter();
   }
  }
   else if(res<0) 
   {
     //等待失败
       printf("wait失败\n");
       quit=1;
   }
  }
 }
  return 0;
}


//int main()
//{
//  printf("i am father\n");
//  int i=0;
//  for(i=0;i<150;i++)
//  {
//    printf("%d %s\n",i,strerror(i));
//  }
//  sleep(3);
//  pid_t pid=fork();
//  if(pid<0)
//  {
//    printf("error\n");
//  }
//
//  if(pid==0)
//  {
//   int cnt=5; 
//    while(cnt--)
//    {
//    sleep(2);
//    printf("i am child,pid:%d,ppid:%d\n",getpid(),getppid());
//    
//    }
//    exit(12);
//  }
//
//  if(pid>0)
//  {
//    sleep(10);
//    int status;
//    //pid_t res=wait(&status);
//   
//    //被回收的子进程的pid=res，
//    //(status>>8)&0xFF是输出型参数--是被回收的子进程的退出状态（退出码），
//    //status&0x7F--若子进程不正常退出时，子进程的退出码将失效，此时status&0x7F表示子进程退出时的接收的信号
//    pid_t res =waitpid(pid,&status,0);
//    
//    if(res>0)
//    {
//      printf("回收子进程pid:%d成功,子进程的退出状态是:%d,子进程退出的信号编号是:%d\n",res,(status>>8)&0xFF,status&0x7F);
//    }
//    while(1)
//    {
//    sleep(2);
//    printf("i am father,pid:%d,ppid:%d\n",getpid(),getppid());
//    }
//  }
//  
//  return 0;
//}
